/*
 * BenchmarkPluginImpl.java
 * 
 * Copyright (c) 2011, Ralf Biedert All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list of
 * conditions and the following disclaimer. Redistributions in binary form must reproduce the
 * above copyright notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 
 * Neither the name of the author nor the names of its contributors may be used to endorse or
 * promote products derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 */
package test.benchmarks.plugins.impl;

import static net.jcores.jre.CoreKeeper.$;
import net.jcores.jre.interfaces.functions.F0;
import net.xeoh.plugins.base.annotations.PluginImplementation;
import test.benchmarks.ClientTest;
import test.benchmarks.plugins.BenchmarkPlugin;
import test.benchmarks.plugins.Callback;

@PluginImplementation
public class BenchmarkPluginImpl implements BenchmarkPlugin {

    public int simpleInt(int input) {
        return input * 2;
    }

    public void simpleVoid(int input) {
        return;
    }

    public String testCallback(final Callback callback) {
        long measure1 = $.measure(new F0() {
            public void f() {
                for (int i = 0; i < ClientTest.N; i++) {
                    callback.callback("" + ClientTest.N);
                }
            }
        });
        
        long measure2 = $.measure(new F0() {
            public void f() {
                for (int i = 0; i < ClientTest.N / 10; i++) {
                    String[] array = $.range(10).string().array(String.class);
                    callback.callback(array);
                }
            }
        });
      
        long measure3 = $.measure(new F0() {
            public void f() {
                for (int i = 0; i < ClientTest.N; i++) {
                    callback.callback(new String[] {"" + ClientTest.N});
                }
            }
        });

        return "Callback result (single): " + ClientTest.N + " call took " + ClientTest.fmt(measure1) + " ms.\n" +
        "Callback result (multi): " + ClientTest.N + " call took " + ClientTest.fmt(measure2) + " ms.\n" +
        "Callback result (singlewasted): " + ClientTest.N + " call took " + ClientTest.fmt(measure3) + " ms.";

    }

}
